package jonggyuni.basic;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class J18_JDBCSetup {

	//JDBC 접속 정보
	private static final String DRV = "oracle.jdbc.OracleDriver";
	private static final String URL = "jdbc:oracle:thin:@//localhost:1521/xe";
	private static final String USR = "scott";
	private static final String PWD = "TIGER";
	
	
	//SQL문 작성
	
	private static final String insertSQL=	"insert into sungjuk(sjno, name, kor, eng, mat)"+
					"VALUES (SJNO.nextval, '혜교',"+"78,45,12)";
	
	private static final String selectSQL="select * from sungjuk " + " order by sjno desc";
	//sql문 쓸때 앞뒤로 빈칸을 꼭 만들자. 빈칸을 만들지 않으면 from sungjukorder by sjno 가 되어버려서 에러발생.
	
	
	
	public static void main(String[] args) {
		//오라클을 이용한 JDBC프로그래밍 기초
		//1. JDBC 드라이버를 메모리에 적재하여
		//   객체로 생성하고 이것을 DriverManager에 등록
		//2. DriverManager의 getConnection 메서드를 이용해서 데이터 베이스 연결객체를 생성
		//3. PreparedStatement로 실행 SQL문 객체를 생성
		//4. 실행하는 SQL문이 insert, update, delete인 경우 executeUpdate()를 사용
		//   실행하는 SQL문이 select라면 executeQuery()를 사용하고
		//   실행 결과는 ResultSet으로 받음
		//5. ResultSet으로 받은 결과 테이블은 먼저 rs.next()로 읽어올 레코드(행)를 가리킨 후
		//   rs.getXXX(필드번호) 또는 rs.getXXX(필드이름)으로 테이블의 각 필드 값을 처리할 수 있음
		//6. JDBC 작업이 끝나면 데이터베이스 접속을 끊고 관련 객체(conn, ps, rs)는 메모리에서 제거함
		
		
////////////기본적으로 작성해 둘것!!!!///////////////////////////////		
		Connection conn = null;                               //연결객체 저장용 
		                                                      //DriverManager를 변수에 저장하기 위해서는 
		                                                      //java.sql에 있는 interface를 가져와야 함
		
		PreparedStatement ps = null;                          //SQL객체
		ResultSet rs = null;                                  //실행결과 저장용
/////////////////////////////////////////////////////////////		
		
		
		try{// class.forname에 JDBC드라이버 입력//1번.
			Class.forName(DRV);                               //등록
			conn = DriverManager.getConnection(URL, USR, PWD);//접속(서버,아이디,비번)//접속결과를 conn에 넣는다
			ps = conn.prepareStatement(insertSQL);            //실행할 sql문 생성
			int cnt=ps.executeUpdate();                       //sql문 실행 및 카운트
			System.out.println( cnt + "건의 데이터 입력");          //획의 갯수를 확인하게 해주는 소스
			ps.close();                                       //또다른 SQL문을 작성하기 위해  기존 ps 객체 제거
			
			
			ps=conn.prepareStatement(selectSQL);              //새로운 sql문 생성
			rs=ps.executeQuery();                             //select는 executeQuery() 결과를 rs에 담아두기
			                                                  //나비캣으로 테이블 형태로 전송
			                                                  //ResultSet rs = stmt.executeQuery("select * from student") 이런식으로 사용 가능
			//ResultSet에서 결과를 레코드 단위로 꺼내 차례대로 출력
			while(rs.next()){                                 //데이터가 한 개 이상! 그래서 while문
				System.out.println(rs.getInt(1));             //컬럼(field)단위로! get사용! getInt, getString
				System.out.println(rs.getString("name"));     //getInt에서의 1은 첫번째 컬럼을 가져온다는 이야기
			}                                                 //getString에서 name은 해당 컬럼을 
			                                                  //숫자가 아닌 컬럼명의 입력으로도 가져올 수 있음을 보여줌
		
		}catch(Exception ex){                                 //예외가 발생한다는 에러가 뜨기 때문에 try&catch이용 
			ex.printStackTrace();
		}finally{                                             //JDBC작업이 끝난후 메모리에서 객체 제거
			if(rs!=null)                                      //rs객체가 사용중이라면 작업을 끝내는 경우니까 종료 명령어를 넣는다
				try {rs.close();}
				catch (SQLException e) {e.printStackTrace();}
			if(ps!=null)
				try {ps.close();}
				catch (SQLException e) {e.printStackTrace();}
			if(conn!=null)
				try {conn.close();} 
				catch (SQLException e) {e.printStackTrace();}
		}//try&catch&finally
		
		
		//try&catch
		
		
		
		
	}//main

}//class
